Skip to main content

带令牌修饰符的 readncFile2

这个 CNC12_TokenModifier.project 示例项目位于的安装目录中 CODESYS 下面 ..\CODESYS SoftMotion\Examples

此示例说明如何在导入期间修改 G 代码,以便将路径速度单位(F 字)从 mm/min 转换为 mm/s。这是通过插入 G 代码来完成的 1/60.0 * 读取 F 字的 G 代码时,在速度值之前。 F6000 然后变成 F 1/60.0 * 6000,稍后由 SMC_NCInterpreter 功能块到 F100。在简单的情况下,你可以跳过乘法 1/60 然后只需调整值(例如,从 6000100)。但是,乘法更为通用,因为它在使用变量时也起作用 F $SPEED$ 变成 F 1/60.0 * $SPEED$

应用程序的结构

与CNC应用程序一样,该应用程序包括路径处理(CNC_PreparePath 程序)和插值(CNC 程序)。由于插值与其他示例没有区别,因此此处不作进一步讨论

在低优先级中,每隔 20 毫秒循环调用路径处理 PathTask。在高优先级中,每 4 毫秒循环调用插值 MotionTask。后台任务 VISU_TASK 是为可视化定义的。

您可以开始处理可视化中的 G 代码。G 代码和机器的移动(3D 龙门架)显示在可视化的右侧

G 代码

CNC_PathSpeed

N10 G01 X1000 F6000
N20 Y1000

在这个 G 代码中,以方块为单位的路径速度 N10 设置为 F6000 到 6000 毫米/分钟。但是,CNC 功能块期望路径速度以 mm/s 为单位。命令进行两次线性运动,首先是 X=1000 然后到 X=1000, Y=1000

代币处理

这个 SMC_ReadNCFile2SMC_ReadNCFromStream 功能块提供了在读取 G 代码时执行您自己的转换的能力。这里我们使用的是 SMC_ITokenModifier 接口,通过传递 aTokenModifier 输入。

此接口适用于 “令牌”。这些是 G 代码的基本部分,开始处理时将 G 代码文本细分为

54. 示例
N50 G36 O$plc_variable$ D'TextTest' X-1 (Comment)

此 G 代码细分如下:

文本

SMC_TOKENTYPE

SMC_TOKENVALUE

N

identifer

stValue = 'N'

50

number

fValue = 50.0

G

identifer

stValue = 'G'

36

number

fValue = 36.0

O

identifer

stValue = 'O'

$plc_variable$

variable

stValue = 'plc_variable'

D

identifer

stValue = 'D'

'TextTest'

strLiteral

stValue = 'TextTest'

X

identifer

stValue = 'X'

-

operator

stValue = '-'

1

number

fValue = 1.0



不需要进一步处理的信息(例如空白字符、换行符和注释)不会出现在标记列表中。

SMC_ITokenModifier 接口已实现,可以通过添加新令牌,删除令牌和更改令牌的值来调整令牌列表。

. 该接口定义了两种方法:
  • Start:功能块的初始化。内部状态已重置。

  • Call: 处理 G 代码时调用此方法。可以从输入队列中读取和删除令牌,然后将其添加到输出队列中。

实施

. PLC_PRG 中的处理流程如下所示:
  • 所有令牌都从输入队列移到输出队列。

  • 如果检测到 F 字,则有两个新标记, 1/60*,在 “F” 的标记之后和速度值的标记之前添加。

这个 Call 方法包含处理令牌的逻辑。首先将令牌从输入队列中移出会很有帮助(tokensIn) 到临时队列 (m_tmpQueue),在那里处理它们,然后将它们移到输出队列 (tokensOut)。临时队列并不是调整路径速度的绝对必要条件,但在更复杂的情况下,它可以简化程序结构。

方法:打电话

起初,系统在 STATE_RUNNING 状态直到处理可以开始(当输入队列中有令牌并且输出队列中仍有空间时)。

IF NOT SMC_NC_CanProcessTokens(tokensIn, tokensOut) THEN
    // Wait until processing can proceed
    RETURN;
END_IF

然后将令牌从输入队列移到临时队列。

IF m_tmpQueue.IsEmpty() THEN
    // Move the next token from the in-queue to the tmp-queue.
    pt := tokensIn.GetFromStart(0);
    m_tmpQueue.Append(pt^);
    tokensIn.RemoveFirst();
END_IF

实际处理是在中完成的 ConvertSpeed 方法。

IF NOT m_tmpQueue.IsEmpty() THEN
    // The actual processing is done here
    ConvertSpeed();
END_IF

在方法结束时,令牌从临时队列移动到输出队列。

方法:ConvertSpeed

检查临时队列中的第一个令牌。

如果标识符的值为 F 找到了,然后再添加两个代币:数字 1/60.0 和操作员 *

(选择临时队列大小的方法是,除了输入队列中的一个令牌之外,队列中还能容纳另外两个令牌)。

tk := m_tmpQueue.GetFromStart(0)^;

IF tk.tokenType = SMC_TokenType.identifier THEN
    tk.GetString(pbyString => pby, iSize => iSize);
    // 70 = ASCII code for F (path velocity)
    IF iSize = 1 AND pby^ = 70 THEN
        // Insert the number 1/60
        SMC_Token_InitNumber(
            tk:= tkNumber,
            value:= 1/60.0,
            srcPos:= tk.srcPos);
        m_tmpQueue.Append(tkNumber);

        // Insert operator '*' for multiplication
        SMC_Token_InitOperator(
            tk:= tkOperator,
            value:= '*',
            srcPos:= tk.srcPos);
        m_tmpQueue.Append(tkOperator);
    END_IF
END_IF

调试

  1. 生成应用程序并将其下载到控制器。

  2. 启动应用程序,切换到可视化,然后按 Start